#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QDebug>
#include <QFont>
#include <QMessageBox>
MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    /*
        总结QT事件处理函数命名规律
           1.实际开发中，我们用的最多的就是重写事件处理函数
             原因：重写事件处理函数，可以实现程序员想要的各种复杂逻辑
           2.常用的事件如下
                        事件类名字      处理函数名字
                      QMouseEvent      mouseMoveEvent(QMouseEvent *e)
                                       mousePressEvent(QMouseEvent *e)
                                       mouseReleaseEvent(QMouseEvent *e)
                      QKeyEvent        keyReleaseEvent(QKeyEvent *e)
                                       keyPressEvent(QKeyEvent *e)
                      QResizeEvent     resizeEvent(QResizeEvent *event)
                      QCloseEvent      closeEvent(QCloseEvent *event)
                      QHoverEvent      hoverEnterEvent(QGraphicsSceneHoverEvent *event)
                                       hoverLeaveEvent(QGraphicsSceneHoverEvent *event)
             总结：观察发现所有的事件处理函数都是虚函数(为了实现多态，让程序员重写这些虚函数实现自己的逻辑)
                  事件处理函数命名规律  动词Event(事件类型指针)
    */
    n=8; //字体大小
}

MainWindow::~MainWindow()
{
    delete ui;
}
//鼠标事件其中一个事件处理函数--》这里具体的动作是用户把鼠标按下去
void MainWindow::mousePressEvent(QMouseEvent *event)
{
    //判断你点击的是哪个键
//    auto ret=event->button();
//    if(ret==Qt::RightButton)
//        qDebug()<<"你用鼠标右键按下了";
//    if(ret==Qt::LeftButton)
//        qDebug()<<"你用鼠标左键按下了";
//    if(ret==Qt::MidButton)
//        qDebug()<<"你用鼠标中间键按下了";

    //获取鼠标相对坐标--》以窗口左上角作为(0,0)
    //qDebug()<<"你按下的位置坐标是: "<<event->x()<<","<<event->y();

    //移动按钮
    //ui->pushButton->move(event->x(),event->y());
}
//鼠标移动对应的事件处理函数
void MainWindow::mouseMoveEvent(QMouseEvent *e)
{
    qDebug()<<"鼠标移动了";
    //移动按钮
    ui->widget->move(e->x(),e->y());
}
//大小改变事件
void MainWindow::resizeEvent(QResizeEvent *e)
{
    QSize osize=e->oldSize();
    QSize nsize=e->size();

    if(nsize.width()>osize.width() || nsize.height()>osize.height())
    {
        QFont myfont("楷体",n);
        if(n<72)
            n++;
        else
            n=8;
        ui->pushButton->setFont(myfont);
    }
    if(nsize.width()<osize.width() || nsize.height()<osize.height())
    {
        QFont myfont("楷体",n);
        if(n>8)
            n--;
        else
            n=8;
        ui->pushButton->setFont(myfont);
    }


}
//移动事件的处理函数
void MainWindow::moveEvent(QMoveEvent *e)
{
    qDebug()<<"窗口整体移动--》拖着窗口到处跑";
}
//关闭事件的事件处理函数
void MainWindow::closeEvent(QCloseEvent *e)
{
    //qDebug()<<"你关闭窗口就会调用这个";
    auto ret=QMessageBox::warning(this,"确认关闭","你真的要舍我而去吗",QMessageBox::Ok|QMessageBox::Cancel);
    //判断你点击了消息盒子的哪个按钮
    if(ret==QMessageBox::Cancel)
    {
        //不要关闭当前窗口
        e->ignore(); //忽略关闭事件
    }
}
//按键事件的处理函数
void MainWindow::keyPressEvent(QKeyEvent *e)
{
    if(e->key()==Qt::Key_Enter)
        qDebug()<<"你按了回车";
    if(e->key()==Qt::Key_A)
        qDebug()<<"你按了A键";
    if(e->key()==Qt::Key_1)
        qDebug()<<"你按了数字1键";

    if(e->key()==Qt::Key_Shift)
        qDebug()<<"你按了shift键";
    if(e->key()==Qt::Key_F1)
        qDebug()<<"你按了F1键";

    //获取按键的字面值-->有局限性，某些特殊按键无法显示字面值
    //qDebug()<<"你现在按下按键字面值: "<<e->text();
}

void MainWindow::enterEvent(QEvent *e)
{
    qDebug()<<"鼠标光标进入窗口边界";
}

void MainWindow::leaveEvent(QEvent *event)
{
    qDebug()<<"鼠标光标离开窗口边界";
}
//光标进入
void MainWindow::focusInEvent(QFocusEvent *e)
{
    //你用鼠标点击了该组件--》鼠标光标才会聚集到这个组件，该函数才调用
    qDebug()<<"鼠标光标进入到组件了";
}
//光标出去
void MainWindow::focusOutEvent(QFocusEvent *e)
{
    qDebug()<<"鼠标光标进入离开组件了";
}

